#!/usr/bin/env python
# encoding: utf-8
'''
@author: wangjianrong
@software: pycharm
@file: 贝叶斯滤波.py
@time: 2020/9/28 11:48
@desc:
https://blog.csdn.net/varyshare/article/details/100098979
假设有一个机器人它在困在一个管子里面了，只能前进或后退。管子的长度是20cm。机器人收到"前进"命令后有三种可能“有25%概率不执行，有50%概率前进1cm，有25%概率前进2cm”。
当然也有特殊情况当机器人离端点只有1cm的时候那么它“25%概率不执行命令，75%概率只走1cm”。当机器人就在端点的时候它就卡住了。
现在机器人在11cm那个地方，我向它发送了9个“前进”控制命令。问机器人执行完这9个命令后在各个位置的概率各是多少（即求机器人位于各个位置的概率分布）。
'''

import numpy as np
prob = np.hstack((np.zeros(10),1,np.zeros(9)))
prob_update = np.zeros(20)
for _ in range(9):# 前进9次
    for i in range(prob.shape[0]):
        if i == (prob.shape[0]-1): # 如果就是在端点那就会100%不执行任何操作
            prob_update[i] += prob[i]
            pass
        elif i == (prob.shape[0]-2):
            # 如果是离端点只有一位那25%不执行任何操作，75%跳到下一位
            prob_update[i] += prob[i]*0.25
            prob_update[i+1] += prob[i]*0.75
            pass
        else:
            # 只要i不是靠近端点那就有三种情况
            prob_update[i] += prob[i]*0.25
            prob_update[i+1] += prob[i]*0.5
            prob_update[i+2] += prob[i]*0.25
            pass
        pass
    prob = prob_update
    print(np.sum(prob))
    prob_update = np.zeros(20)
    pass

import matplotlib.pyplot as plt
plt.xticks(np.arange(0, 20, 1))
plt.imshow(np.expand_dims(prob,axis=0),cmap=plt.get_cmap('Greys'))
plt.show()
print(prob)